代码随想录 链表:160. 链表相交
文章讲解:https://programmercarl.com/面试题02.07.链表相交.html
题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
思路
- 两个节点相交意味着指针相等。但是如果设置遍历指针的话,两个指针同时向右走,因为链表长度不一样,一定是存在一个差值的,不会同时到达相交节点,就无法判断,那该怎么做呢?
- 既然长度不一样,有差值我们能否利用这个差值呢?比如,长度较长的那个链表 起始遍历节点先往后走差值个节点,然后在一起往后走,是不是并排走了?每次往后走都比较指针是否相等(即是否指向同一个节点)。如果相等,说明找到了第一个相交节点;如果都走到末尾还没相等,说明没有交点。
方法核心是"对齐剩余长度",让两个指针同步前进。
怎么想到?
- 链表的"同步"思想:
你可以想象两个人分别从不同长度的跑道起跑,要在终点线相遇。让跑得慢的人提前出发,或者让跑得快的人多跑几步,最终他们会在终点线同步到达。
这里的"终点线"就是链表的尾部,"提前出发"就是让长链表先走多出来的那几步。
- 面试常见套路:
这类"对齐"技巧在链表题目中很常见,比如"环形链表入口"、"链表倒数第 k 个节点"等等。